<?php

class functions
{	
	/*
	 * Строим массив дерева, относительно 
	 * текущего раздела в корень структуры
	 * @return array
	 */
	/*public function getDependantsTree($table, $active_id)
	{
		$r =& Registry::get("MDB")->query("SELECT * FROM `".$table."` WHERE `ID`='".$active_id."' AND `Show`='1' ORDER BY `Por`");		
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}		
		while ($p = $r->fetchRow(MDB2_FETCHMODE_ASSOC))
		{
			$dependences[] = $p;				
			$depen         = functions::getDependantsTree($p['parent']);				
			$dependences   = array_merge_recursive($depen, $dependences);
		}		
		return $dependences;
	}*/
	
	/*
	 * Удаляем спецсимволы
	 *
	 */
	public static function deleteSpecialSimbols($text) {
		return str_replace(array("\n", "\r", "\t"),"", $text); 
	}
	
	/*
	 * Проверяем корректность пути и наличие контроллера
	 * @return string
	 * 16/09/2011 12:10
	 */
	public static function setPath($path) {
		$path = rtrim($path, '/\\').'/';
		try 
		{
			if (is_dir($path) == false) {
				throw new Exception('Invalid controller path: `' . $path . '`');
			}
			return $path;
		}
		catch(Exception $e) {
			die("Error: ".$e->getMessage()." in line ".$e->getLine()." [file: ".$e->getFile()."]");
		}
	}
	
	/*
	 * Проверяем корректность пути и наличие контроллера
	 * @return string
	 * 16/09/2011 12:11
	 */
	public static function getInfoUpdate($table)
	{
		$r =& Registry::get("MDB")->query("SHOW TABLE STATUS FROM `".Registry::get("DB_NAME")."` LIKE '".$table."';");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows()) {			
			return $r->fetchRow(MDB2_FETCHMODE_ASSOC);
		}
	}
	
	
	
	/* Есть ли потомки */
	public static function isChildrens($table, $id) 
	{
		$r =& Registry::get("MDB")->query("SELECT COUNT(id) FROM `".$table."` WHERE `Parent`='".$id."';");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows()){
			$p = $r->fetchRow(MDB2_FETCHMODE_ASSOC);
			if($p["count(id)"] > 0) {
				return true;
			}
			return false;			
		}		
	}	
	
	/* 
	 * Загрузка изображений
	 * return @string;
	 */
	public static function getImage($folder, $id, $name, $i, $postfix, $format = "normal", $type = "normal", &$w = false, &$h = false) {
		switch($type) {
			default:
			case "normal":
				$file = "uploads/".$folder."/".$id."_".$i."_".$postfix;
			break;	
			
			case "md5":
				$file = "uploads/".$folder."/".md5($id."_".$i."_").$postfix;
			break;
		}		
		if(file_exists(ROOT_DIR."/".$file))
		{
			$size = getimagesize($file);
			$w = $size[0];
			$h = $size[1];
			switch($format) {
				default:
				case "normal":					
					return '<img src="/'.$file.'" '.$size[3].' alt="'.$name.'" title="'.$name.'" />';
				break;
				
				case "background":		
					return '/'.$file;
				break;
			}	
		}	
	}	
	
	
	/**
    * Удалите все не буквенно-цифровые символы, за исключением пробелов
    * @param    string    $string The string to cleanse
    * @return   string
    */
    public static function alphanumericAndSpace( $string ) {
        return preg_replace('/[^а-яА-Яa-zA-Z0-9\s]/ui', '', $string);
    }
	/**
	 * @Свернуть все пробелы в единый пробел
	 * @param string $string
	 * @return string
	 */
	public static function collapseWhiteSpace($string){
		return  preg_replace('/\s+/ui', ' ', $string);
	}
	
	/* 
	  Форматирование числа
	  @return string 
	 */
	public static function numberformat($int, $after_comma = 0, $separator_end = ' ', $separator_between = ' ') {
		if($int) {
			return number_format($int, $after_comma, $separator_end, $separator_between);	
		}
	}
	
	/* Нахождение формы в тексте, извлечение ее ID */
	public static function getIdForm($text)
	{			 
		$h1count = preg_match_all('/(<div class="form-site-replace id)(.*?)(">)/i', $text, $patterns);  
		return $patterns[2];  
	}
	
	public static function findFormInText($text)
	{
		$arrayId = functions::getIdForm($text);
		if(is_array($arrayId)) {
			foreach($arrayId as $id)
			{
				$ob_module = new MAIL(functions::getNewLevel(PRFX."modules", $id), $id);
				Registry::get("smarty")->assign($ob_module->form());					
				return preg_replace(
					'/<div class="form-site-replace id'.$id.'">(.+?)<\/div>/i', 
					Registry::get("smarty")->fetch(TEMPLATE_SITE.'mail.site.tpl', Registry::get("cache_id")), 
					$text
				);
			}
		}
	}
	
	/*public static function getNewLevel($table, $id)
	{
		$r =& Registry::get("MDB")->query("SELECT `sys_name` FROM `".$table."` WHERE `id`='".$id."' LIMIT 1;");
		if (PEAR::isError($r)) {
			die($r->getMessage());
		}
		if($r->numRows()) {
			$p = $r->fetchRow(MDB2_FETCHMODE_ASSOC);
			return $p['sys_name'];
		}
	}*/
	
	public static function navigation($st, $nachalo_ssilki, $kol_vidimyx_stranic, $kol_dannix, $kol_dannix_na_stran)
	{
		$return = array();
		if($kol_dannix > $kol_dannix_na_stran)
		{
			$ostatok = $kol_dannix % $kol_dannix_na_stran;
			$kolichestvo_stranic = ($kol_dannix - $ostatok) / $kol_dannix_na_stran;
			
			/* Доп переменная для отображения всех страниц (hack) */
			$kolichestvo_stranic_new = $kolichestvo_stranic;
			
			/* Если остаток был больше нуля, значит остается еще 
			 * несколько объяв, для которых нужна еще одна страница 
			 */
			if($ostatok>0) {   
				$kolichestvo_stranic++;
			}
			
			/* если больше количества видимых страниц, 
			 * начинаем прятать другие страницы в >>>
			 */
			if($kolichestvo_stranic > $kol_vidimyx_stranic)
			{
				$kol_stranic_s_leva = ceil($kol_vidimyx_stranic / 2);				
				/* (отсекание левой части)Если открыта страница выше пятой, 
				 * то i примет другое значение, а если меньше пятой, то i будет 0
				 */
				if($st > $kol_stranic_s_leva) {
					$i = $st - $kol_stranic_s_leva;
					$menshe = $i;
					
				}
				else {
					$i=0;
				}			
				/* отсекание правой части */
				if($i + $kol_vidimyx_stranic<$kolichestvo_stranic) {
					$bolshe = $i + $kol_vidimyx_stranic + 1;
					if($bolshe>$kolichestvo_stranic) {
						$bolshe=$kolichestvo_stranic;
					}
					$kolichestvo_stranic = $i + $kol_vidimyx_stranic;
				}
			}	
			else {
				$i=0;
			}
	
			if($menshe < 1) {
				$menshe = 1;
			}
			/* Если вывод с первой страницы 1 2 3 4... то <<< выводить не надо */
			if($i > 0) {
				$return["prev"] = $nachalo_ssilki.'/page/'.$menshe.'.html" class="modern-page-previous backward">Предыдущая</a> ';			
			}
	
			/* проверяем, если видимых страниц получается меньше, 
			 * чем нужно(когда уже последние страницы выводятся), 
			 * тогда $i делаем таким, чтобы получилось столько страниц, 
			 * сколько нужно видимых... 
			 */
			if(($kolichestvo_stranic - $i) < $kol_vidimyx_stranic) {
				$i=$kolichestvo_stranic - $kol_vidimyx_stranic;
				/* если вдуг страниц на вывод мало, 
				 * тогда i уйдет в минус, но минусов не надо.. 
				 */
				if($i < 0) {
					$i = 0;
				}
			}
			/* hack */
			$i = 0;
			//while($i < $kolichestvo_stranic)
			/* hack */
			while($i < $kolichestvo_stranic_new)
			{
				$iii = $i + 1;
				/* Это условие выводит либо ссылку, либо просто 
				 * цифру(если данная ссылка активна)
				 */
				// echo $iii;
				if($st == $iii) {
					$return["pages"].= ' <span class="modern-page-current'.(($iii == 1) ? " modern-page-first" : '').'">'.$iii.'</span> ';
				}
				else{
					$return["pages"].= $nachalo_ssilki.'/page/'.$iii.'.html" class="page'.(($iii == 1) ? " modern-page-first" : '').'">'.$iii.'</a> ';
				}
				$i++;
			}
			if($bolshe){
				$return["next"] = $nachalo_ssilki.'/page/'.$bolshe.'.html" class="modern-page-next">Следующая</a>';				
			}
			//print_r($return);
			return $return;
		}
	}
	
	public static function count_position($Table, $Parent, $Dop_query = false)
	{	  
		$r =& Registry::get("MDB")->query(($Dop_query ? $Dop_query : "SELECT `ID` FROM `".$Table."` WHERE `Show`='1' AND `Parent`='".$Parent."';"));
		if (PEAR::isError($r)) {
			die($r->getMessage());
		}
		return $r->numRows();
	}
	
	public static function page_num($level1, $number_page, $count, $show_in_page)
	{		
		$num = eregi_replace("[^0-9]", "", $number_page);
		if(empty($num)) {
			$num = 1;
		}		
		$param["limit"]     = 'LIMIT '.($show_in_page * ($num-1)).','.$show_in_page;
		$param["navyPages"] = functions::navigation($num, '<a href="/'.$level1, 1, $count, $show_in_page);
				
		return $param;
	}
	
	/* Увеличиваем Счетчик Por */
	public static function incrPor($table, $active_group = false)
	{	
		$r =& Registry::get("MDB")->query("SELECT MAX(Por), `Por` FROM `".$table."` ".(is_numeric($active_group) ? " WHERE `Parent`='".$active_group."'" : "")." GROUP BY `Por` DESC LIMIT 1;");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows())
		{			
			$p = $r->fetchRow(MDB2_FETCHMODE_ASSOC);
			return $p['por']+1;
		}
		else {
			return "0";
		}
	}
	
	/* 
	  Удалить записи
	  @return string;
	*/
	public static function deleteItems($post_array, $table)
	{
		if(!empty($post_array['id_delete']))
		{
			$count = 0;
			foreach($post_array['id_delete'] as $k => $v)
			{
				$r =& Registry::get("MDB")->query("DELETE FROM `".$table."` WHERE `id` = '".$v."';");
				if (PEAR::isError($r)) {
					die($r->getMessage().' ::: '.$r->getUserInfo());
				}
				$count++;
			}
						
			$name_counter = number_ending($count, "записей", "запись", "записи");			
			return '<div id="info_table" class="ui-state-error ui-corner-all">
			<p><span class="ui-icon ui-icon-alert" style="float:left;margin-right:.3em;"></span>
			<strong>Удалены:</strong> <strong>'.$count.'</strong> '.$name_counter.'!</p>
			</div>';
		}
	}
	
	/*
	  Обновление порядка
	  @return;
	*/	
	public static function updateItems($post_array, $table, $field) {		
		if(!empty($post_array[$field])) {
			foreach($post_array[$field] as $k => $v) {
				$r =& Registry::get("MDB")->query("UPDATE `".$table."` SET `".$field."`='".$v."' WHERE `id` = '".$k."';");
				if (PEAR::isError($r)) {
					die($r->getMessage().' ::: '.$r->getUserInfo());
				}
			}		
		}		
	}	
		
	/*
	  Insert to mysql base string
	  @return string;
	*/	
	public static function insert_sql($table, $insert_name_static)
	{
		$r =& Registry::get("MDB")->query("SELECT * FROM `".$table."` LIMIT 1;");		
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}																	 
		$arr_field = $r->_getColumnNames();
		foreach($arr_field as $field=>$key) {			
			$mres.= "$".$field."= mysql_real_escape_string($".$field.");"."\n";
			$zaprArray[] = "'$".$field."'";
		}
		
		return $mres.'$'.$insert_name_static.' = "INSERT INTO `'.$table.'` VALUES ('.implode(", ", $zaprArray).');";';
	}
	
	
	/*
	  Update to mysql base
	  @return string;
	*/	
	public static function update_sql($table, $insert_name_static, $key_field, $key_id)
	{
		$r =& Registry::get("MDB")->query("SELECT * FROM `".$table."` LIMIT 1;");		
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		$arr_field = $r->_getColumnNames();

		foreach($arr_field as $field=>$key)
		{			
			if($key_field == $field) {
				continue;	
			}
			$mres.= "$".$field."= mysql_real_escape_string($".$field.");"."\n";			
			$zaprArray[] = "`".$field."`='$".$field."'";
		}
		
		return $mres."$".$insert_name_static." = \"UPDATE `".$table."` SET ".implode(", ", $zaprArray)." WHERE `".$key_field."`='".$key_id."'\";";	
	}
	
	/*
	 * Уникальное системное имя
	 */
	public static function get_free_num($string, $table, $number)
	{		
		$r =& Registry::get("MDB")->query("SELECT `Sys_name` FROM `".$table."` WHERE `Sys_name`='".$string.'_'.$number."' LIMIT 1;");		
		if(PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows()) {
			$number++;
			$string = functions::get_free_num($string, $table, $number);
		}
		else {
			$string = $string.'_'.$number;
		}		
		return $string;
	}
	
	
	/*
	  Get list module script
	  @return string;
	 */
	/*public static function get_work_script($open_dir, $path)
	{	
		$dir = opendir($open_dir);
		while ($file = readdir($dir)){
			if (($file != ".") && ($file != "..")){	
				if(substr($file, -4, 4) == '.php') {
					$workScript.= '<option value="'.$file.'" '.(($path == $file) ? 'selected="selected"' : '').'>'.$file.'</option>';
				}
			}
		}
		closedir($dir);		
		return $workScript;
	}*/
	
	/*
	  Get list templates
	  @return string;
	 */
	/*public static function tplView($db_object)
	{
		$r =& $db_object->query("SELECT * FROM `".PRFX."tpl` ORDER BY `id`;;");		
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows())
		{			
			$ArrayListTpl = array();
			while($p = $r->fetchRow(MDB2_FETCHMODE_ASSOC)) {
				$ArrayListTpl[] = array(
					"tpl"  => $p['tpl'],
					"name" => $p['name']
				);
			}			
		}	
		return $ArrayListTpl;
	}*/
	
	/*
	  Redirect
	  @return array;
	 */
	/*public static function is_redirect($l, $r) {
		$_o["l"] = ($r ? $r : $l);		
		if($r) {
			if(substr_count($r, "http:") > 0) {
				$_o["t"] = ' target="_blank"';
			}					
		}
		
		return $_o;
	}*/
	
	/*
	  Create Title
	  @return string;
	 */
	public static function createTitle($array = array(), $is_title, $separator = " - ")
	{
		if(empty($is_title)) {
			return implode($separator, array_reverse(array_merge(array(NAME_SITE), $array)));
		}
		else {
			return $is_title;
		}
	}
}

?>